Node.js + MongoDB 后端学习笔记

学习后端有两个礼拜了。当然,实际学习时间不过三四天,但感觉入门木有问题了,起码我的目标:为前端提供数据支持已经没有问题了。其他复杂的逻辑和数据处理就等需要的时候边学边做吧。
在这里主要总结和探讨下后端知识以及如何更快的掌握一门新技术。

Node.js学习

学习目标:为前端提供 RESTful API 接口。

Node方面,我快速浏览一遍基础教程,对很多知识点都是了解即可。主要是关注在写 RESTful 接口这一块的知识点:

  • 全局对象 —— 了解node中经常出现的全局对象是必要的。
  • 常用模块 —— 对出现频率搞得模块要熟悉的,如 fs、http、util 等
  • GET、POST 请求和 RESTful API —— 这是我的主要学习目标,认真看完并且照着示例代码实现一遍。
  • Express 框架 —— 已知的比较适合新手学习的node框架,熟悉基本用法,照着实现一遍。
  • 连接 MongoDB —— 学习如何连接MongoDB,这个在学习了MongoDB基本知识后重点学习。

因为暂时只为了提供接口,所以只要对Node有个大致的了解。然后重点关注写接口、数据库和框架。当我看完一遍资料,并将重点的知识点实际操作实现一遍之后,我对 node 就有了大致了解了~达到了给我一个 Node 后端项目我能看懂大部分代码逻辑的程度。之后看一下 Express 框架~

Express

学习目标: 使用 Express 快速搭建 Node 后端项目,配合之前学到的 Node 基础知识为前端提供 API 接口支持

这里把 Express 的官方文档API看了一遍,发现呢其实 Express 的东西不多,在看过node基本知识后还是很好理解的。
我就用了 Express 提供的应用生成器生成一个 Express 项目。项目很简单,主要是修改 app.jsroutes 文件夹里面的东西,写法与Node教程里的差不多。在终端执行 $ npm start 命令即可进行调试。
一开始我还没学习MongoDB的时候我是用的JSON文件来存取数据的下面是我写的一段代码

var express = require('express');
var fs = require('fs')
var router = express.Router();

router.get('/', function (req, res, next) {
    res.send('Hello World');
});

// 获取所有数据
router.get('/getlist', function (req, res, next) {
    fs.readFile(__dirname + '/data/plan.json', 'utf8', function (err, data) {
        if (err) {
            res.send(err)
        } else {
            res.send(data)
        }
    })
})

router.get('/test', function (req, res, next) {
    fs.readFile(__dirname + '/data/plan.json', 'utf8', function (err, data) {
        var name = req.query.name
        var hasVal = false
        if (name == undefined) {
            res.send('need name')
        } else if (err) {
            res.send(err)
        } else {
            var obj = JSON.parse(data)
            for (var key in obj) {
                if (obj[key].name == name) {
                    hasVal = obj[key]
                }
            }
            if (hasVal) {
                res.send(JSON.stringify(hasVal))
            } else {
                res.send('name no found')
            }
        }
    })
})

module.exports = router;

通过 node 的文件模块来获取 plan.json 文件,这样就实现了使用 Express 框架写 GET 接口的目标。访问 http://localhost:8082/file/getlist 获取如下结果:

[
  { "Date": "2017-6-11", "Time": "10:22", "Detail": "洗澡", "Describe": "宝宝洗干净" }, 
  { "Date": "2017-6-13", "Time": "10:22", "Detail": "开饭", "Describe": "宝宝要吃饭" }
 ]

调试过程建议使用Postman,调试各类接口都特别方便。

数据库

学习目标:了解 MongoDB 基本知识,重点掌握数据的增删改查和 MongoDB 与 Node.js 的连接

接下来转战数据库,这里选择了 MongoDB 。在明确了学习目标之后,重点学习增删改查和数据库连接,其他的以了解为主。就在这样的目标之下,重点学习以下知识:

  • 安装、创建数据库以及数据库的一些常用操作。
  • 找到一个好的数据库 GUI —— 发现了 Robomongo,感觉挺好用的。
  • 创建、删除数据库。
  • 插入、更新、查询、删除文档 —— 这当然是重中之重,所有示例逐个实现一遍
  • 除此之外,想数据处理、比较、数据数量限制limit、排序sort等了解即可,需要的时候查阅一下就可以解决问题。

配合Node里面的 Node.js MongoDB 章节,动手实践连接后端与数据库了。照着教程来连接成功应该不难。成功在 Express 项目中获取到数据库数据就说明连接成功了。现在就可以开始你的表演了!
除了GET和POST,另外两个请求的写法差不多,DELETE类似GET方法,而PUT类似POST方法。
哦,对了,数据库和node的连接所用的中间件有mongodb、mongoose等,我简单粗暴,用的最基本的MongoDB来写的。下面是我写的第一个后端接口代码:

plan.js

var DBUtils = require('./DBUtils')
var express = require('express');
var fs = require('fs')
var router = express.Router();
var bodyParser = require('body-parser')
var ObjectID = require('mongodb').ObjectID

// 创建 application/x-www-form-urlencoded 编码解析
var urlencodedParser = bodyParser.urlencoded({ extended: false })

router.get('/', function (req, res, next) {
    res.send('Hello MongoDB');
});

router.get('/findAllPlan', function (req, res, next) {
    DBUtils.getDB(function (db) {
        var collection = db.collection('plan')
        collection.find().toArray(function (err, result) {
            if (err) {
                console.log('Err:' + err)
                return
            }
            console.log(result)
            res.send(result)
            db.close()
        })
    })
});

router.get('/findPlanByDate', function (req, res, next) {
    DBUtils.getDB(function (db) {
        var collection = db.collection('plan')
        var Date = req.query.Date
        console.log(Date)
        var whereStr = { 'Date': Date }
        collection.find(whereStr).toArray(function (err, result) {
            if (err) {
                console.log('Err:' + err)
                return
            }
            console.log(result)
            res.send(result)
            db.close()
        })
    })
})

router.get('/findPlanById', function (req, res, next) {
    DBUtils.getDB(function (db) {
        var collection = db.collection('plan')
        var whereStr = { '_id': ObjectID(req.query._id) }
        collection.find(whereStr).toArray(function (err, result) {
            if (err) {
                console.log('Err:' + err)
                return
            }
            console.log(result)
            if (result.length > 0) {
                res.send(result[0])
            } else {
                res.send({ 'msg': '未找到相应数据' })
            }
            db.close()
        })
    })
})

router.post('/', urlencodedParser, function (req, res, next) {
    DBUtils.getDB(function (db) {
        var collection = db.collection('plan')
        console.log(req.body)
        var response = {
            'Date': req.body.Date,
            'Time': req.body.Time,
            'Title': req.body.Title,
            'Describe': req.body.Describe
        }
        collection.insert(response, function (err, result) {
            if (err) {
                console.log('Error:' + err)
                return
            }
            res.send({ 'msg': '添加成功' })
        })
    })
})

router.put('/', urlencodedParser, function (req, res, next) {
    DBUtils.getDB(function (db) {
        var collection = db.collection('plan')
        var whereStr = {
            '_id': ObjectID(req.body._id),
        }
        var response = {
            'Date': req.body.Date,
            'Time': req.body.Time,
            'Title': req.body.Title,
            'Describe': req.body.Describe
        }
        collection.update(whereStr, { $set: response }, function (err, result) {
            if (err) {
                console.log('Error:' + err)
                return
            }
            res.send({ 'msg': '更新成功' })
        })
    })
})

router.delete('/', function (req, res, next) {
    DBUtils.getDB(function (db) {
        var collection = db.collection('plan')
        var Id = req.query.Id
        var whereStr = { '_id': ObjectID(Id) }
        collection.remove(whereStr, function (err, result) {
            if (err) {
                console.log('Error:' + err)
                return
            }
            res.send({ 'msg': '删除成功' })
        })
    })
})

module.exports = router

DBUtils.js

var MongoClient = require('mongodb').MongoClient
var DB_COUN_STR = 'mongodb://localhost:8081/etdb'// 数据库地址

module.exports = {
    getDB: function (callback) {
        MongoClient.connect(DB_COUN_STR, function (err, db) {
            callback(db)
        })
    }
}

关于跨域问题

由于都是本地服务器 localhost,遇到了跨域的问题,后来找到了最简单粗暴的方法,安装一个 cors 中间件就好了。具体用法:

$ npm install cors --save

app.js 中使用 cors

var cors = require('cors');
app.use(cors())

关于学习效率

学习后端和数据库实际就花了三四天吧,感觉自己学习效率还是可以的。分享下我的学习方法。

  • 明确学习目标,学习始终围绕着目标来。
  • 快速浏览学习资料,找出与学习目标有关的资料重点学习。
  • 使用番茄时间工作法,将专注集中到一个时间段上,劳逸结合。不推荐一口气看三四个小时,效率会低下的。
  • 学习技术必须边看资料,边敲代码。木有实践的知识难以理解也不容易被记住。
  • 写博客、笔记记录总结学到的知识点。学会和能教是两种境界。

总的来说,我感觉学习新技术首先是要有个目标——学习这门新技术目标是什么?然后根据目标来学习。先快速浏览筛选出能帮我们实现目标的知识,然后抓重点学习。这样学习才能够快速掌握一门知识。书上说过:一本书只有20%的知识是常用的,只要掌握了这20%就可以运用这项知识了,所以我们要根据目标找准那20%的知识,快速入门。而那其余的80%等到需要的时候再回去查也不迟。
像我一开始学习技术,几十集教学视频,一集集地看,每一集的实例都去实现一遍,结果花了一个多月才学完了课程。而在投入工作后才发现很多东西不常用,而且真到用的时候基本上也忘了也是要靠查资料才可以完成任务的。所以,重要的东西要重点学,其他东西了解大概,到用的时候知道有这么回事,知道怎么查就好~
在这个技术变化极快的时代,每一门技术都不知道何时会被淘汰,所以我觉得程序员的最大财富在于学习能力和解决问题的能力,而非技术本身。所以呢,坚持不断地去学习和奋斗才能不被这个快速发展和变化的时代所淘汰啊~之后我会实践更多学习新技术的过程,从中总结出一套快速学习新技术的方法来。

关于我

VioletJack,移动、前端工程师,两年移动端工作经验、一年前端工作经验。现专注于全栈开发、效率管理、学习方法的学习。会定期产出关于Android、Vue、移动前端相关的博文。欢迎大家关注我,我会用心维护和经营好博客,多产出高质量文章。同时也希望我所写的东西可以帮到有需要的朋友。
新浪微博: http://weibo.com/u/2640909603
掘金:https://gold.xitu.io/user/571d953d39b0570068145cd1
CSDN: http://blog.csdn.net/violetjack0808
简书: http://www.jianshu.com/users/54ae4af3a98d/latest_articles
Github: https://github.com/violetjack

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容